package com.up.stores.controller;

import com.sun.media.sound.DLSInfo;
import com.up.stores.controller.ex.*;
//import com.github.pagehelper.PageHelper;
//import com.github.pagehelper.PageInfo;
import com.up.stores.entity.Brand;
import com.up.stores.entity.Category;
import com.up.stores.entity.Product;
import com.up.stores.service.IBrandService;
import com.up.stores.service.ICategoryService;
import com.up.stores.service.IProductService;
import com.up.stores.until.JsonResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.eclipse.core.internal.properties.IPropertyManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.w3c.dom.ls.LSInput;

import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

@Api(tags = "商品模块")
@RequestMapping("Product")
@RestController
public class ProductController extends BaseController{
    @Autowired
    private IProductService productService;
    @Autowired
    private IBrandService brandService;
    @Autowired
    private ICategoryService categoryService;
    /**
     * 展示所有的商品
     */
    @GetMapping("/ShowAllProducts")
    @ApiOperation(value = "展示所有商品,一页20个")
    public List<Product> ShowAll(Integer pageNum,Integer pageSize){
        List<Product>list=new ArrayList<>();
        list=productService.GetALLPro(pageNum, pageSize);
        return list;

    }
    /**
     * 商品上架
     */
    //注册拦截，只允许商家通过
    @PutMapping("/ListProduct")
    @ApiOperation(value = "上架商品")
    public JsonResult<Void> ListPro(HttpSession session,
                                    Product product){
        String name=getUsernameFromSession(session);
        productService.ListPro(product,name);
        return new JsonResult<Void>(OK);
    }
    /**
     *获取品牌名称
     */
    @GetMapping("/getBrandList")
    @ApiOperation(value = "获得品牌的名称")
    private JsonResult<List<Brand>>getBrandList(){
        List<Brand>list=new ArrayList<>();
        list=brandService.GetAllBrand();
        return new JsonResult<List<Brand>>(OK,list);
    }

    /**
     * 获取分类类别
     */
    @GetMapping("/getCategory")
    @ApiOperation(value = "获得分类的名称")
    private JsonResult<List<Category>>getCate(Integer pid){
        List<Category>list=new ArrayList<>();
        list=categoryService.getCategory(pid);
        return new JsonResult<List<Category>>(OK,list);
    }

    /**
     * 创建新商品
     */
    @PostMapping("/createProduct")
    @ApiOperation(value = "新建商品")
    private JsonResult<Void> createPro(HttpSession session,
                                         MultipartFile image0,
                                         MultipartFile image1,
                                         String title,
                                         String sell_point,
                                         Long price,
                                         Integer num,
                                         String brandName,
                                         String CategoryName
                                         ){
        Product product=new Product();
        String  BrandId=null;
        BrandId=brandService.getBrandIdByName(brandName);
        if(image0!=null){String image0Root=PutImage(image0,session); product.setImageLong(image0Root);}
        if(image1!=null){String image1Root=PutImage(image1,session); product.setImageShort(image1Root);}
        Date date=new Date();
        product.setBrandId(BrandId);
        product.setCreatedTime(date);
        product.setCreatedUser(getUsernameFromSession(session));
        product.setStatus(1);
        product.setBusId(getuidFromSession(session));
        product.setTitle(title);
        product.setSellPoint(sell_point);
        product.setPrice(price);
        product.setNum(num);
        productService.CreateProduct(product);
        return  new JsonResult<Void>(OK);
    }

    /**
     * 商品的详细信息
     */
    @GetMapping("/Info")
    @ApiOperation(value = "显示商品信息")
    private JsonResult<Product> findPro(HttpSession session,
                                        Integer proId){
        Product product=productService.findById(proId);
        return new JsonResult<Product>(OK,product);
    }


    /**
     * 下架商品
     * 注册拦截器，只有对应的商家有资格下架
     */
    @PutMapping("/showProduct/unListProduct")
    @ApiOperation(value = "下架商品")
    public JsonResult<Void> UnListPro(HttpSession session,
                                      Product product){
        productService.UnlistPro(product.getProId(),getUsernameFromSession(session));
        return new JsonResult<Void>(OK);
    }

    /**
     * 商家对自己的商品管理的页面
     * 注册拦截器，只允许商家
     */
    @GetMapping("/showMyProduct")
    @ApiOperation(value = "显示当前登陆的商家的所有商品")
    public JsonResult<List<Product>> showMyPro(HttpSession session){
        Integer id=getuidFromSession(session);
        List<Product>list=productService.ShowMyProduct(id);
        return new JsonResult<List<Product>>(OK,list);

    }
    @PutMapping("/showProduct/updataProduct")
    @ApiOperation(value = "下架商品")
    public JsonResult<Product> UpdataProduct(HttpSession session,
                                             Product product){
        Product product1=productService.UpdataProduct(product);
        return new JsonResult<Product>(OK,product1);
    }


    public static final int AVATAR_MAX_SIZE = 10 * 1024 * 1024;
    /** 允许上传的头像的文件类型 */
    public static final List<String> AVATAR_TYPES = new ArrayList<String>();
    /** 初始化允许上传的头像的文件类型 */
    static {
        AVATAR_TYPES.add("image/jpeg");
        AVATAR_TYPES.add("image/png");
        AVATAR_TYPES.add("image/bmp");
        AVATAR_TYPES.add("image/gif");
    }

    private String PutImage(MultipartFile file,HttpSession session){
        if (file.isEmpty()) {
            // 是：抛出异常
            throw new FileEmptyException("上传的头像文件不允许为空");
        }

        // 判断上传的文件大小是否超出限制值
        if (file.getSize() > AVATAR_MAX_SIZE) { // getSize()：返回文件的大小，以字节为单位
            // 是：抛出异常
            throw new FileSizeException("不允许上传超过" + (AVATAR_MAX_SIZE / 1024) + "KB的头像文件");
        }

        // 判断上传的文件类型是否超出限制
        String contentType = file.getContentType();
        // public boolean list.contains(Object o)：当前列表若包含某元素，返回结果为true；若不包含该元素，返回结果为false。
        if (!AVATAR_TYPES.contains(contentType)) {
            // 是：抛出异常
            throw new FileTypeException("不支持使用该类型的文件作为头像，允许的文件类型：\n" + AVATAR_TYPES);
        }

        // 获取当前项目的绝对磁盘路径
        //String parent = session.getServletContext().getRealPath("upload");
        String parent = "/root/Pictures/";
        System.out.println(parent);
        // 保存头像文件的文件夹
        File dir = new File(parent);
        if (!dir.exists()) {
            dir.mkdirs();
        }

        // 保存的头像文件的文件名
        String suffix = "";
        String originalFilename = file.getOriginalFilename();
        int beginIndex = originalFilename.lastIndexOf(".");
        if (beginIndex > 0) {
            suffix = originalFilename.substring(beginIndex);
        }
        String filename = UUID.randomUUID().toString() + suffix;

        // 创建文件对象，表示保存的头像文件
        File dest = new File(dir, filename);
        // 执行保存头像文件
        try {
            file.transferTo(dest);
        } catch (IllegalStateException e) {
            // 抛出异常
            throw new FileStateException("文件状态异常，可能文件已被移动或删除");
        } catch (IOException e) {
            // 抛出异常
            throw new FileUploadIOException("上传文件时读写错误，请稍后重尝试");
        }
        // 头像路径
        String avatar = "http://101.34.3.160:8080" + parent + filename;
        return avatar;
    }
}
